/**
 * gislin 2017年7月20日
 */
package com.btcode.db.connection;

import static com.alibaba.druid.util.JdbcSqlStatUtils.rtrim;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceStatLoggerImpl;
import com.alibaba.druid.pool.DruidDataSourceStatValue;
import com.alibaba.druid.pool.vendor.OracleExceptionSorter;
import com.alibaba.druid.stat.JdbcSqlStatValue;
import com.alibaba.druid.support.json.JSONUtils;
import com.alibaba.druid.util.Utils;
import com.btcode.common.MyLog;
import com.btcode.db.config.DataBaseConfig;
import com.btcode.exception.MsgException;
import com.btcode.log.ILog;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author gislin 2017年7月20日
 */
public class PostgreSQLConnectionGetter extends DefaultConnectionGetter {

    private ILog log = MyLog.getInstance().getLogger(getClass());

    public PostgreSQLConnectionGetter(DataBaseConfig config) {
        super(config);
    }

    @Override
    protected DruidDataSource getDataSource(DataBaseConfig config){
        //获取默认的连接池
        DruidDataSource dataSource = DruidDataSourceHelp.getDefault(config);
        dataSource.setPoolPreparedStatements(true);//是否缓存preparedStatement，也就是PSCache。PSCache对支持游标的数据库性能提升巨大，比如说oracle。在mysql下建议关闭。
        //要启用PSCache，必须配置大于0，当大于0时，poolPreparedStatements自动触发修改为true。在Druid中，不会存在Oracle下PSCache占用内存过多的问题，可以把这个数值配置大一些，比如说100
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(100);

        dataSource.setExceptionSorter(new OracleExceptionSorter() {//当数据库抛出一些不可恢复的异常时，抛弃连接
            @Override
            public boolean isExceptionFatal(SQLException e) {
                log.error(config.getUserName() + " postgresql", e);
                return super.isExceptionFatal(e);
            }
        });

        dataSource.setStatLogger(new DruidDataSourceStatLoggerImpl() {//连接池定时监控
            @Override
            public void log(DruidDataSourceStatValue statValue) {
                log.info(config.getUserName() + getDruidDataSourceStatInfo(statValue));
            }
        });

        return dataSource;
    }
}
